# 作业：
# 1、整理类的笔记到小红书
# day_008_note.py


# 2、定义一个学生Student类。有下面的类属性：
# (1) 姓名 name
# (2) 年龄 age
# (3) 成绩 score（语文，数学，英语) [每课成绩的类型为整数]
# class Student:
#     def __init__(self, name, age, score):
#         self.name = name
#         self.age = age
#         self.score = score
#
#     def get_name(self):
#         return self.name
#
#     def get_age(self):
#         return self.age
#
#     def get_course(self):
#         list1 = []
#         a = self.score[0]
#         for i in self.score:
#             if a < i:
#                 a = i
#             elif a > i:
#                 i = a
#         list1.append(int(a))
#         return list1
#     def cn(self):
#         return self.score[0]
#     def math(self):
#         return self.score[1]
#     def en(self):
#         return self.score[2]
#
# zm = Student('zhangming', 20, [69, 88, 100])
# yj = Student('yujun', 23, [62, 58, 77])

# 类方法：
# (1) 获取学生的姓名：get_name() 返回类型:str
# print(f"获取学生的姓名：",str(zm.get_name()))
# print(f"返回类型:",type(zm.get_name()))
#
# (2) 获取学生的年龄：get_age() 返回类型:int
# print(f"获取学生的年龄:",zm.get_age())
# print(f"返回类型:",type(zm.get_age))
#
# (3) 返回3门科目中最高的分数。get_course() 返回类型:int
# print(f"3们科目中最高的分数:",zm.get_course())
# print(f"返回类型:",type(zm.get_course()))

# (4) 将每个实例学生对象写进txt文件里，要持久保存
# 举例：{"姓名":"a","年龄":29,"成绩":{"语文":99,"数学":100,"英语":85}
# answer_dict = {"姓名":zm.get_name(),"年龄":zm.get_age(),"成绩":{"语文":zm.cn(),"数学":zm.math(),"英语":zm.en()}}
# print(answer_dict)

# (5) 获取所有学生的信息
# zm_info = {'name': zm.get_name(),'age': zm.get_age(),'score': zm.get_course()}
# yj_info = {'name': yj.get_name(),'age': yj.get_age(),'score': yj.get_course()}
# print(zm_info)
# print(yj_info)

# ====================================================END===============================================================

# 3、定义一个字典类：dictclass。完成下面的功能：
# dict = dictclass({你需要操作的字典对象})
# class Dictclass:
#     def __init__(self,my_dict):
#         self.my_dict = my_dict
#
#     def del_dict(self,key):    #删除某个key
#         if key in self.my_dict:
#             del self.my_dict[key]
#             return self.my_dict
#         else:
#             return False
#     def found_dict(self,key):   #判断某个键是否在字典里，如果在返回键对应的值，不存在则返回"not found"
#         if key in self.my_dict:
#             return self.my_dict[key]
#         else:
#             return f"not found"
#     def list_dict(self):   #返回键组成的列表
#         dict_list = list(self.my_dict.items())
#         return dict_list
#     def update_dict(self,dict1,dict2):
#         dict1.update(dict2)
#         answer_list =[]
#         for key,value in dict1.items():
#             answer_list.append(value)
#         return dict1 , answer_list
#测试用的两个字典
# dict1 = {"姓名":"小王","年龄":18}
# dict2 = {"城市":"沈阳","居住地":"沈阳大街"}
# dict0 = {}
#赋值
# d0 = Dictclass(dict0)
# d1 = Dictclass(dict1)
# d2 = Dictclass(dict2)
# (1) 删除某个key
# print(d1.del_dict(key="姓名"))

# (2) 判断某个键是否在字典里，如果在返回键对应的值，不存在则返回"not found"
# print(d1.found_dict(key="姓名"))
# print(d1.found_dict(key="大王"))

# (3) 返回键组成的列表：返回类型;(list)
# print(d1.list_dict())

# (4) 合并字典，并且返回合并后字典的values组成的列表。返回类型:(list)
# print(d0.update_dict(dict1=dict1,dict2=dict2))

# ====================================================END===============================================================

# 4、定义一个列表的操作类：Listinfo
# 包括的方法:
# import logging
#
# class Listinfo:
#     def __init__(self,list):
#         self.list = list
#     def add_key(self,keyname):  #列表元素添加
#         new_list = []
#         for i in keyname:
#             new_list.append(i)
#         return new_list
#     def get_key(self,num):
#         answer_list = [i for i in num if isinstance(i,int)]
#         return answer_list
#     def update_list(self,l1,l2):
#         l1.append(l2)
#         return l1
#     def del_key(self,l0):
#         answer_list = []
#         answer_list.append(l0[-1])
#         return answer_list

# #定两个列表
# list0 = []
# list1 = [123,456,789,'asd']
# list2 = [111,222,333,444,'zxc',520]
#将两个列表赋值
# l0 = Listinfo(list0)
# l1 = Listinfo(list1)
# l2 = Listinfo(list2)
# (1) 列表元素添加: add_key(keyname) [keyname:字符串或者整数类型]
# print(l0.add_key([123154,5461,4891,'dfshajkh']))

# (2) 列表元素取值：get_key(num) [num:整数类型]
# print(l1.get_key(list1))

# (3) 列表合并：update_list(list) [list:列表类型]
# print(l0.update_list(list1,list2))

# (4) 删除并且返回最后一个元素：del_key()
# print(l0.del_key(list1))

# ====================================================END===============================================================

# 5、做一个学生点名系统，系统里支持：存入学生、更改学生、删除学生、点到学生姓名方法
# class StudentName():
#     def __init__(self,name,age,address,phone_number):
#         self.name = name
#         self.age = age
#         self.address = address
#         self.phone_number = phone_number
#     def add_student_name(self,age,address,phone_number):
#         student_name_dict = {}
#         student_name_dict["小天才"] = "年龄",age,"家庭住址",address,"手机号",phone_number
#         print(student_name_dict)
#         return f"存入成功"
#     def updata_student_dict(self):
#         student_name_dict = {'小天才': ('年龄', '120', '家庭住址', '沈阳', '手机号', 15145475713)}
#
#
# p1 = StudentName()
# 存入学生（姓名、年龄、家庭地址、手机号）： 存入成功后，提示xxx存入成功
# print(p1.add_student_name("120","沈阳",15145475713))
# 更改学生（姓名、年龄、家庭地址、手机号）：可以修改学生内容的任意一个字段
#
# 删除学生：删除的学生将不在展示
# 展示全部学生：可以看到全部的学生姓名
# 学生姓名：随机抽取任意一个存在的学生信息，然后打印：到！。举例： 刘闯到！
# 以上内容，需要连接数据库，每次的数据都需要增、删、改、查去做
# student表：name、age、address、phone_number

# ====================================================END===============================================================

# 6、点餐管理系统
# class Restaurant:
#     def __init__(self):
#         self.caipin = {}
#
#     def add_dish(self, name, price):
#         if name in self.caipin:
#             print(f"菜品'{name}'已存在，请选择其他菜品名字！")
#             return
#         if price > 15:
#             print("菜品价格不允许超过15元！")
#             return
#         self.caipin[name] = {"price": price, "stock": 999}
#         print(f"成功添加菜品'{name}'，价格为{price}元")
#
#     def remove_dish(self, name):
#         if name in self.caipin:
#             del self.caipin[name]
#             print(f"成功下架菜品'{name}'")
#         else:
#             print(f"菜品'{name}'不存在，无法下架！")
#
#     def update_dish_price(self, name, new_price):
#         if name in self.caipin:
#             if new_price > 15:
#                 print("菜品价格不允许超过15元！")
#                 return
#             self.caipin[name]["price"] = new_price
#             print(f"成功修改菜品'{name}'的价格为{new_price}元")
#         else:
#             print(f"菜品'{name}'不存在，无法修改价格！")
#
#     def receive_rating(self, name, rating):
#         if name in self.caipin:
#             if not 0 <= rating <= 5:
#                 print("评分范围应在0~5之间！")
#                 return
#             if "total_rating" not in self.caipin[name]:
#                 self.caipin[name]["total_rating"] = 0
#                 self.caipin[name]["num_ratings"] = 0
#             self.caipin[name]["total_rating"] += rating
#             self.caipin[name]["num_ratings"] += 1
#             print(f"成功收到菜品'{name}'的评分")
#         else:
#             print(f"菜品'{name}'不存在，无法接收评分！")
#
#     def check_caipin(self):
#         print("菜单：")
#         for name, info in self.caipin.items():
#             print(f"{name} - 价格：{info['price']}元 库存：{info['stock']}")
#
#     def check_average_rating(self):
#         print("平均评分：")
#         for name, info in self.caipin.items():
#             if "total_rating" in info and info["num_ratings"] > 0:
#                 average_rating = info["total_rating"] / info["num_ratings"]
#                 print(f"{name} - 平均评分：{average_rating:.2f}")
#             else:
#                 print(f"{name} - 尚未接受评分")
#
# restaurant = Restaurant()

# (1) 餐馆可以新增菜品、下架菜品、修改菜品
# restaurant.add_dish("红烧肉", 20)
# restaurant.add_dish("宫保鸡丁", 15)
# restaurant.add_dish("鱼香肉丝", 12)
# restaurant.update_dish_price("红烧肉", 18)
# restaurant.remove_dish("鱼香肉丝")
# (2) 每个菜品，都有对应的库存，所有菜品的库存均为999，每出一道菜，库存-1
#     菜品有对应的价格，餐厅老板定义价格每道菜不允许超过15元，没有小数单位，均为整数
# (3) 餐馆后台有点赞系统，能够收集客户对菜品的喜好，0~5分
# restaurant.receive_rating("红烧肉", 4)
# restaurant.receive_rating("红烧肉", 5)
# restaurant.receive_rating("宫保鸡丁", 3)
# (4) 有菜品评分提报功能，对平均分数（菜品总分/打分人数）低于3分的菜品进行强制下架；
# restaurant.check_caipin()
# restaurant.check_average_rating()

# ====================================================END===============================================================

# 7、定义一个桌子类（Desk），包含长（length）、宽（width）、高（height）属性
#    包含一个打印桌子信息属性的方法（showInfo）。实例化2个桌子对象，为其赋予不同的属性值，并调用showInfo方法，输出每个桌子的信息。
#
#
# 8、定义一个用户类(User),用户名(username)和密码(password)是这个类的属性。
# class User:
#     def __init__(self, username, password):
#         self.username = username
#         self.password = password
#
# user1 = User("admin", "Aa123456!")
# print(user1.username)
# print(user1.password)
#
# user2 = User("Hold_yun", "0123456789")
# print(user2.username)
# print(user2.password)

# ====================================================END===============================================================

# 9、定义一个计算器类，有加减乘除四个方法

# 10、创建一个名为Person的类，具有以下属性和方法：
# 属性：name（姓名），age（年龄）
# 方法：greet()，打印出一句问候语，包括该人的姓名和年龄
#
#
# 11、定义一个图书管理系统类，图书可以新增、修改、删除，要求新增的每个图书都加到txt文本里，数据持久化
# 新增：图书名、作者名称、新建年月日
# 修改：图书名、作者名称、新建年月日
# 删除：图书删掉，且不在展示
# 查看：全量查询，精确查询，需要用户传入形参来控制返回结果
#
#
# 12、创建一个名为"Car"的类，该类具有"品牌"和"颜色"属性。创建一个"start_engine"方法，该方法打印出"启动汽车引擎！"的消息。创建一个"stop_engine"方法，该方法打印出"关闭汽车引擎！"的消息
#
#
# 13、淘宝商家后台，可以上架商品、下架商品，功能如下：
# （1） 可以添加商品，商家添加完的商品会存到商品列表
# 1.1  商品要有名称、sku、价格
# （2） 可以修改商品信息：名称、sku、价格
# （3） 可以对商品进行下架，下架后的商品不再展示
#
#
# 14、定义一个人类
# 1.小明和小美都爱跑步
# 2.小美体重45.0公斤
# 3.小明体重75.0公斤
# 4.每次跑步都会减少0.5公斤
# 5.每次吃东西都会增加1公斤

# class Person:
#     def __init__(self, name, weight):
#         self.name = name
#         self.weight = weight
#
#     def run(self):
#         print(f"{self.name}跑步")
#         self.weight -= 0.5
#         print(f"{self.name}跑步后体重是{self.weight}公斤")
#
#     def eat(self):
#         print(f"{self.name}吃东西")
#         self.weight += 1
#         print(f"{self.name}吃东西后体重是{self.weight}公斤")
#
# ming = Person("小明", 75.0)
# mei = Person("小美", 45.0)
# ming.run()
# mei.run()
# ming.eat()
# mei.eat()

# ====================================================END===============================================================

# 15、士兵瑞恩有一把ak47
# 士兵可以开火（开火扣动的是班级）
# 抢能够发射子弹（把子弹打出去）
# 抢能够装子弹–增加子弹数量
# 要求没子弹，需要输出没有子弹了，且发射失败
# class Soldier:
#     def __init__(self, name, gun):
#         self.name = name
#         self.gun = gun
#
#     def fire(self):
#         if self.gun.bullets > 0:
#             print(f"{self.name}开火！")
#             self.gun.shoot()
#             print(f"弹匣剩余子弹数量：{self.gun.bullets}")
#         else:
#             print("没有子弹了，发射失败！")
#
#     def reload(self, bullets):
#         self.gun.load_bullets(bullets)
#
#
# class Gun:
#     def __init__(self):
#         self.bullets = 0
#         self.max_bullets = 30
#
#     def shoot(self):
#         self.bullets -= 1
#         print("子弹发射！")
#
#     def load_bullets(self, bullets):
#         if bullets <= 0:
#             print("装填数量必须大于0！")
#             return
#         elif bullets + self.bullets > self.max_bullets:
#             diff = self.max_bullets - self.bullets
#             self.bullets = self.max_bullets
#             print(f"弹匣已装满！装填了{diff}颗子弹")
#         else:
#             self.bullets += bullets
#             print(f"装填了{bullets}颗子弹，弹匣剩余子弹数量：{self.bullets}")
#
#
# # 创建士兵瑞恩和一把AK47枪的实例对象
# ryan = Soldier("瑞恩", Gun())
#
# # 给瑞恩的枪装填25颗子弹
# ryan.reload(25)
#
# # 瑞恩开火（有子弹）
# ryan.fire()
#
# # 给瑞恩的枪装填10颗子弹
# ryan.reload(10)
#
# # 瑞恩连续开火（有子弹）
# ryan.fire()
# ryan.fire()
#
# # 给瑞恩的枪装填5颗子弹
# ryan.reload(5)
#
# # 瑞恩开火（有子弹）
# ryan.fire()
#
# # 给瑞恩的枪装填20颗子弹
# ryan.reload(20)
#
# # 瑞恩连续开火（有子弹）
# ryan.fire()
# ryan.fire()
# ryan.fire()

# ====================================================END===============================================================
